package com.xjl.example.threadpool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by xiaojinlu1990@163.com on 2019/12/1.
 * 线程池的核心方法--》会根据任务的多少弹性的增加或者减少线程池数量
 * 使用场景：在线程可控的情况下使用，否则可能会oom，线程过多导致系统性能过慢
 *
 *
 *     public static ExecutorService newCachedThreadPool() {
         return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
         60L, TimeUnit.SECONDS,
         new SynchronousQueue<Runnable>());
         }
 *
 * 1.核心线程数为零
 * 2.最大线程数为无限
 * 3.无任务时，线程存活的最大时间为60s
 * 4.任务队列为同步移交队列，该队列没有缓冲区，即不会有任务会在该队列中排队，每当有任务要入队时，队列都会将任务移交给一个可用的线程
 *
 *参数解释
 *
 @param  int corePoolSize // 核心线程数，线程启动就一个线程保持线程数
 @param  int maximumPoolSize, // 最大线程数，线程池的最大线程数不能大于这个数
 @param  long keepAliveTime, //  超过线程的核心数 corePoolSize的线程数保持的时间
 @param  TimeUnit unit,  //  时间的单位
 @param  BlockingQueue<Runnable> workQueue  //在线程池满的情况下，保持到该队列中。只保存runnble状态的
 *
 *
 *
 * newCachedThreadPool
 * 1 execute  调用线程功能执行
 * 2 submit  调用线程执行有返回值
 * 3 shoutDown  等任务执行完在停止
 * 4 shoutDownNew 立即结束执行
 *
 */
@Slf4j
public class ThreadPoolExample {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        for (int i = 0; i <10; i++) {
            final int index = i;
            service.execute(() ->{
                log.info("{}",index);
            });
        }
        service.shutdown();
    }
}
